import { constantRoutes } from "@/router";
import { dynamicRoutes } from "@/router/dynamicRoutes.js";
import { getRouters } from "@/api/menu";
import Layout from "@/layout/index.vue";
import ParentView from "@/components/ParentView/index.vue";
// const modules = import.meta.glob("../views/*/*.vue");

const permission = {
  state: {
    routes: [],
    addRoutes: [],
    sidebarRouters: []
  },
  mutations: {
    SET_ROUTES: (state, routes) => {
      state.addRoutes = routes;
      state.routes = constantRoutes.concat(routes);
    },
    SET_SIDEBAR_ROUTERS: (state, routers) => {
      state.sidebarRouters = constantRoutes.concat(routers);
    }
  },
  actions: {
    // 生成路由
    GenerateRoutes({ commit }) {
      return new Promise(resolve => {
        console.log(dynamicRoutes);

        let tempRoutes = [...dynamicRoutes];

        const filterMenus = (source, target) => {
          return source.filter(o => {
            if (!target) return false;
            let menu = target.find(n => n.name == o.name);
            if (menu) {
              if (o.children && menu.children) {
                o.children = filterMenus(o.children, menu.children);
              }
              o.hidden = !menu.visible;
              o.meta.icon = menu.icon;
              o.meta.title = menu.title;
              o.sort = menu.sort;
              return true;
            }
            return false;
          });
        };

        var data = JSON.parse(localStorage.getItem("routes"));

        if (data) {
          tempRoutes = filterMenus(tempRoutes, data);
        }

        const sortMenus = arr => {
          //数组先排序
          if (Array.isArray(arr)) {
            arr = arr.sort((a, b) => {
              return a.sort > b.sort ? 1 : -1;
            });
            arr.forEach(n => {
              if (n.children) n.children = sortMenus(n.children);
            });
          }
          return arr;
        };
        console.log(sortMenus(tempRoutes));
        const sdata = JSON.parse(JSON.stringify(tempRoutes));
        const rdata = JSON.parse(JSON.stringify(tempRoutes));

        const sidebarRoutes = filterAsyncRouter(sdata);
        const rewriteRoutes = filterAsyncRouter(rdata, true);
        rewriteRoutes.push({ path: "*", redirect: "/404", hidden: true });

        commit("SET_ROUTES", rewriteRoutes);
        commit("SET_SIDEBAR_ROUTERS", sidebarRoutes);

        resolve(rewriteRoutes);
      });
    }
  }
};

// 遍历后台传来的路由字符串，转换为组件对象
function filterAsyncRouter(asyncRouterMap, isRewrite = false) {
  return asyncRouterMap.filter(route => {
    if (isRewrite && route.children) {
      route.children = filterChildren(route.children);
    }
    if (route.component) {
      // Layout ParentView 组件特殊处理
      if (route.component === "Layout") {
        route.component = Layout;
      } else if (route.component === "ParentView") {
        route.component = ParentView;
      } else {
        route.component = loadView(route.component);
      }
    }
    if (route.children != null && route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children, route, isRewrite);
    }
    return true;
  });
}

function filterChildren(childrenMap) {
  var children = [];
  childrenMap.forEach((el, index) => {
    if (el.children && el.children.length) {
      if (el.component === "ParentView") {
        el.children.forEach(c => {
          c.path = el.path + "/" + c.path;
          if (c.children && c.children.length) {
            children = children.concat(filterChildren(c.children, c));
            return;
          }
          children.push(c);
        });
        return;
      }
    }
    children = children.concat(el);
  });
  return children;
}

// export const loadView = view => {
//   // 路由懒加载
//   return () => import(`@/views/${view}.vue`);
// };

export const loadView = view => {
  // 路由懒加载 打包时候用 webpack4不支持 动态表达式
  // return () =>
  //   import(/* webpackChunkName: "[request]" */ `src/views/${view}.vue`);
  //开发环境用require
  return resolve => require([`@/views/${view}`], resolve);
  //return modules[`@/views/${view}.vue`];
};
export default permission;
